package pl.puntin.punclient.messages;

/**
 * Klasa po ktorej dziedzicza wyszystkie wiadomosci.
 * Tak naprawde to tylko namespace.
 * @author kakus
 *
 */
public abstract class Message
{
	private byte[] data;
	private int dataStored = 0;
	private boolean messageComplete = false;
	
	/**
	 * @return zwraca typ wiadmosci
	 */
	public abstract byte getType();
	
	/**
	 * Dzieki tej funkcji klasa Message bedzie potrafila zaladowac swoje dane
	 * @param buffer bufor w ktorym znajduja sie dane
	 * @param offset przesuniecie w buforze
	 * @param bytesLeftInBuffer ile danych jest w buforze
	 * @return zwraca liczbe odczytanych bajtow,
	 */
	public int read(final byte[] buffer, final int offset, final int bytesLeftInBuffer)
	{
		int dataLenght = getLenght();
		if(dataLenght == 1)
		{
			messageComplete  = true;
			return 1;
		}
		
		if(data == null)
			data = new byte[dataLenght];
	
		int i = 0;
		/*
		 * Mamy wiecej lub rowno danych
		 */
		if( bytesLeftInBuffer >= (dataLenght-dataStored))
		{
			for (; i < (dataLenght-dataStored); i++)
			{
				data[i+dataStored] = buffer[i+offset];
			}
			messageComplete = true;
			yourDataIsReadyInitYourSelf(data);
		}
		/*
		 * Mamy mniej danych niz potrzeba
		 */
		else
		{
			for(; i < bytesLeftInBuffer; ++i)
				data[i+dataStored] = buffer[i+offset];
		}
		
		dataStored += i;
		return i;
	}
	
	protected void yourDataIsReadyInitYourSelf(final byte[] data)
	{
		
	}

	/**
	 * Smieciowa funkcja :/
	 * @param buffer
	 * @param offset
	 * @return
	 */
	public int read(final byte[] buffer, final int offset)
	{
		// TODO Auto-generated method stub
		return 0;
	}
	
	/**
	 * @return Dlugosc wiadomosc domyslnie 1
	 */
	public int getLenght()
	{
		return 256;
	}
	
	/**
	 * Konwertuje obiekt na ciag bajtow, aby
	 * moza bylo go wyslac
	 * 
	 * @return skonwertowany obiekt na tablice bajtow
	 */
	public abstract byte[] getByteForm();

	public boolean isComplete()
	{
		return messageComplete;
	}
}

